#!/bin/bash

# 资产管理系统 - CentOS 7 环境准备脚本
# 版本: 1.0
# 作者: Asset Management Team
# 日期: 2025-08-07

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本需要root权限运行"
        exit 1
    fi
}

# 检查系统版本
check_system() {
    log_info "检查系统版本..."
    
    if [[ ! -f /etc/redhat-release ]]; then
        log_error "此脚本仅支持CentOS/RHEL系统"
        exit 1
    fi
    
    local version=$(cat /etc/redhat-release | grep -oE '[0-9]+\.[0-9]+' | head -1)
    local major_version=$(echo $version | cut -d. -f1)
    
    if [[ $major_version -ne 7 ]]; then
        log_error "此脚本仅支持CentOS 7系统，当前版本: $version"
        exit 1
    fi
    
    log_success "系统版本检查通过: $(cat /etc/redhat-release)"
}

# 更新系统
update_system() {
    log_info "更新系统包..."
    yum update -y
    yum install -y epel-release
    yum install -y wget curl vim git unzip
    log_success "系统更新完成"
}

# 安装Docker
install_docker() {
    log_info "检查Docker安装状态..."
    
    if command -v docker &> /dev/null; then
        log_warning "Docker已安装，版本: $(docker --version)"
        return 0
    fi
    
    log_info "安装Docker..."
    
    # 卸载旧版本
    yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    
    # 安装依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # 添加Docker仓库
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
    # 安装Docker CE
    yum install -y docker-ce docker-ce-cli containerd.io
    
    # 启动Docker服务
    systemctl start docker
    systemctl enable docker
    
    # 添加当前用户到docker组
    if [[ -n "$SUDO_USER" ]]; then
        usermod -aG docker $SUDO_USER
        log_info "已将用户 $SUDO_USER 添加到docker组"
    fi
    
    log_success "Docker安装完成: $(docker --version)"
}

# 安装Docker Compose
install_docker_compose() {
    log_info "检查Docker Compose安装状态..."
    
    if command -v docker-compose &> /dev/null; then
        log_warning "Docker Compose已安装，版本: $(docker-compose --version)"
        return 0
    fi
    
    log_info "安装Docker Compose..."
    
    # 下载Docker Compose
    local compose_version="2.21.0"
    curl -L "https://github.com/docker/compose/releases/download/v${compose_version}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
    # 设置执行权限
    chmod +x /usr/local/bin/docker-compose
    
    # 创建软链接
    ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
    
    log_success "Docker Compose安装完成: $(docker-compose --version)"
}

# 配置防火墙
configure_firewall() {
    log_info "配置防火墙..."
    
    # 检查firewalld状态
    if systemctl is-active --quiet firewalld; then
        log_info "配置firewalld规则..."
        
        # 开放HTTP和HTTPS端口
        firewall-cmd --permanent --add-service=http
        firewall-cmd --permanent --add-service=https
        
        # 开放自定义端口
        firewall-cmd --permanent --add-port=3000/tcp  # Grafana
        firewall-cmd --permanent --add-port=9090/tcp  # Prometheus
        
        # 重载防火墙规则
        firewall-cmd --reload
        
        log_success "防火墙配置完成"
    else
        log_warning "firewalld未运行，跳过防火墙配置"
    fi
}

# 配置SELinux
configure_selinux() {
    log_info "配置SELinux..."
    
    local selinux_status=$(getenforce)
    
    if [[ "$selinux_status" == "Enforcing" ]]; then
        log_info "SELinux当前状态: $selinux_status"
        
        # 安装SELinux管理工具
        yum install -y policycoreutils-python
        
        # 设置SELinux策略允许Docker
        setsebool -P container_manage_cgroup on
        
        log_success "SELinux配置完成"
    else
        log_info "SELinux状态: $selinux_status，无需配置"
    fi
}

# 优化系统参数
optimize_system() {
    log_info "优化系统参数..."
    
    # 创建系统优化配置文件
    cat > /etc/sysctl.d/99-asset-management.conf << 'EOF'
# 网络优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_tw_buckets = 5000

# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# 文件描述符限制
fs.file-max = 65535
EOF
    
    # 应用系统参数
    sysctl -p /etc/sysctl.d/99-asset-management.conf
    
    # 设置用户限制
    cat >> /etc/security/limits.conf << 'EOF'
# Asset Management System limits
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
EOF
    
    log_success "系统参数优化完成"
}

# 创建应用目录
create_directories() {
    log_info "创建应用目录..."
    
    local app_dir="/opt/asset-management"
    local backup_dir="/opt/asset_backups"
    local log_dir="/var/log/asset-management"
    
    # 创建目录
    mkdir -p $app_dir
    mkdir -p $backup_dir
    mkdir -p $log_dir
    mkdir -p $log_dir/{nginx,django,mysql,redis,celery}
    
    # 设置权限
    chmod 755 $app_dir
    chmod 755 $backup_dir
    chmod 755 $log_dir
    
    # 创建应用用户
    if ! id "asset" &>/dev/null; then
        useradd -r -s /bin/false -d $app_dir asset
        log_info "创建应用用户: asset"
    fi
    
    # 设置目录所有者
    chown -R asset:asset $app_dir
    chown -R asset:asset $backup_dir
    chown -R asset:asset $log_dir
    
    log_success "应用目录创建完成"
    log_info "应用目录: $app_dir"
    log_info "备份目录: $backup_dir"
    log_info "日志目录: $log_dir"
}

# 安装SSL证书工具
install_ssl_tools() {
    log_info "安装SSL证书工具..."
    
    # 安装certbot
    yum install -y certbot python2-certbot-nginx
    
    log_success "SSL证书工具安装完成"
    log_info "使用 'certbot --nginx' 命令申请SSL证书"
}

# 创建自签名证书（用于测试）
create_self_signed_cert() {
    log_info "创建自签名SSL证书（仅用于测试）..."
    
    local ssl_dir="/opt/asset-management/docker/ssl"
    mkdir -p $ssl_dir
    
    # 生成私钥
    openssl genrsa -out $ssl_dir/key.pem 2048
    
    # 生成证书
    openssl req -new -x509 -key $ssl_dir/key.pem -out $ssl_dir/cert.pem -days 365 -subj "/C=CN/ST=Beijing/L=Beijing/O=Asset Management/CN=localhost"
    
    # 设置权限
    chmod 600 $ssl_dir/key.pem
    chmod 644 $ssl_dir/cert.pem
    chown -R asset:asset $ssl_dir
    
    log_success "自签名证书创建完成"
    log_warning "生产环境请使用正式的SSL证书"
}

# 安装监控工具
install_monitoring_tools() {
    log_info "安装系统监控工具..."
    
    # 安装htop, iotop等监控工具
    yum install -y htop iotop nethogs
    
    log_success "监控工具安装完成"
}

# 主函数
main() {
    log_info "开始CentOS 7环境准备..."
    log_info "脚本版本: 1.0"
    log_info "执行时间: $(date)"
    
    # 执行各个步骤
    check_root
    check_system
    update_system
    install_docker
    install_docker_compose
    configure_firewall
    configure_selinux
    optimize_system
    create_directories
    install_ssl_tools
    create_self_signed_cert
    install_monitoring_tools
    
    log_success "CentOS 7环境准备完成！"
    echo
    log_info "接下来的步骤:"
    log_info "1. 重新登录以使docker组权限生效"
    log_info "2. 运行部署脚本: ./scripts/deploy.sh"
    log_info "3. 如需正式SSL证书，请运行: certbot --nginx"
    echo
    log_warning "建议重启系统以确保所有配置生效"
}

# 执行主函数
main "$@"